//
// Created by Administrator on 2020/3/13 013.
//

#ifndef JOINTO_FISCHERCALC_H
#define JOINTO_FISCHERCALC_H


#include <cstdint>

class FicherCalc{
public:
    FicherCalc(uint8_t *fhrSource, uint8_t *tocoSource, int count, bool hasToco);

    ~FicherCalc();

    //检测时间是设定为25分钟（检测中为0的部分不能算作检测时间需要把为0的部分全部排除，再进行计算，如果中间有为0的部分，从总时间里删掉这一部分时间）
    int Monitor_time = 0;
    //换算成秒，样本数量
    int FHR_Legnth = 0;
    //这个数组内存放的是检测期间采集的胎心率值
    uint8_t *FHR_Orignal;

    //这个数组内存放的是检测期间采集的宫缩率值
    uint8_t *TOCO_Orignal;//开辟一个对应长度的记录原始宫缩压数值的数组
    uint8_t *TOCO_process;    //开辟一个处理宫缩压值的数组
    uint8_t *TOCO_Clear;      //这个数据记录TOCO中的->0<-清零操作，如果某个时刻发出清零操作，那么对应的TOCO_Clear[]就计1，否则计0

    //心率基线的参考曲线
    uint16_t *REFERENCE;
    //心率基线
    uint16_t *FHR_BASELINE;
    //这是一个用于提取基线运算的数组
    uint8_t *Data_store;
    //开辟一个数组，记录检测过程中所有不同的胎心率数值
    int *FHR_conmbine;
    //对应每个不同的胎心率，对应记录其出现的次数
    int *FHR_frequency;
    //胎心基线值
    uint16_t Frequency_max = 0;
    //变异幅度
    uint16_t Baseline_shake = 0;
    //变异频率
    uint16_t Frequency_shake = 0;
    bool noTocoData = false;
    /**疑似加速次数*/
    uint16_t speedup_count = 0;
    /**实际加速次数*/
    uint16_t real_speedup_count = 0;
    /**疑似减速次数*/
    uint16_t speeddown_count = 0;
    /**实际减速次数*/
    uint16_t real_speeddown = 0;

    uint16_t ED_count=0;         //早期减速
    uint16_t LD_count=0;         //晚期减速
    uint16_t VD_count=0;         //常规变异减速
    uint16_t VD_PLUS_count=0;    //重度变异减速
    uint16_t PD_count=0;           //延长减速计数

    //加速区计算
    int *speed_max_dot;   //存放一段加速区间内顶点的位置
    int *speed_max;        //存放加速区间最大值
    //减速区计算
    int *speed_min_dot;   //存放一段减速区间内底点的位置
    int *speed_min;        //存放减速区间最小值
    //宫缩顶点计算
    int *TOCO_peak;              //存放宫缩的顶点峰值
    int *TOCO_Amp;

    uint8_t TOCO_count = 0;

    void calcAll();

    int getBaselineFreq();

    int getThinvari();

    int getVarirFreq();

    int getAcce();

    int getDec();

    int getED();

    int getLD();

    int getVD();

    int getVDp();

    int getPD();

    int* getAcceMaxPosi();

    int* getAcceMax();

    int* getDecMinPosi();

    int* getDecMin();

    int* getTocoPeekPosi();

    int* getTocoPeek();

    int getTocoCount();
private:
    void calcBaseLineFreq();

    void calcThinvari();

    void calcVariFreq();

    void calcAcce();

    void calcDec();
};
#endif //JOINTO_FISCHERCALC_H
